//Leetcode295:数据流的中位数
// 中位数是有序列表中间的数。如果列表长度是偶数，中位数则是中间两个数的平均值。
// 例如，
// [2,3,4] 的中位数是 3
// [2,3] 的中位数是 (2 + 3) / 2 = 2.5
// 设计一个支持以下两种操作的数据结构：
// void addNum(int num) - 从数据流中添加一个整数到数据结构中。
// double findMedian() - 返回目前所有元素的中位数。


class MedianFinder {

    //queMin 建大根堆：用于存放比中位数小/等于中位数的值
    public PriorityQueue<Integer> queMin;
    //queMax 建小根堆：用于存放比中位数大的值
    public PriorityQueue<Integer> queMax;

    /** initialize your data structure here. */
    public MedianFinder() {
        //匿名内部类：传入一个不知类名的比较器对象，不知道类名，但是实现了Comparator接口
        //使用匿名内部类重写Comparator接口中的compare()方法
        queMin = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2){
                return o2-o1; //建大堆
            }
        });

        queMax = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2){
                return o1-o2; //建小堆（默认）
            }
        });
    }

    public void addNum(int num) {
        //queMin判空要放在最前面
        if(queMin.isEmpty() || num <= queMin.peek() ){
            queMin.offer(num);
            if(queMax.size()+1 < queMin.size()){
                queMax.offer(queMin.poll());
            }
        }else{
            queMax.offer(num);
            if(queMin.size() < queMax.size()){
                queMin.offer(queMax.poll());
            }
        }
    }

    public double findMedian() {
        if(queMin.size()>queMax.size()){
            return queMin.peek();
        }
        return (queMin.peek()+queMax.peek()) / 2.0;
    }
}